using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using EP.Entities;
using EP.Services.TodoItem;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using EP.Core;

namespace Api.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TodoItemsController : ControllerBase
    {
        private ITodoItemService _todoItemServices;

        public TodoItemsController(ITodoItemService todoItemService)
        {
            _todoItemServices = todoItemService;
        }
        [HttpGet]
        public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
        {
            return await _todoItemServices.GetTodoItemsAsync();
        }
        [HttpGet("{id}")]
        public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
        {
            var todoItem = await _todoItemServices.GetTodoItemAsync(id);
            if (todoItem == null)
            {
                return NotFound();
            }
            return todoItem;
        }
        [HttpPost]
        public async Task<ActionResult<TodoItem>> CreateTodoItem(
            [Bind("Name, IsComplete")]TodoItem todoItem)
        {
            await _todoItemServices.InsertTodoItemAsync(todoItem);
            return CreatedAtAction(
                nameof(GetTodoItem),
                new { id = todoItem.Id },
                todoItem);
        }
        [HttpDelete("{id}")]
        public async Task<ActionResult<IEnumerable<TodoItem>>> DeleteTodoItem(long id)
        {
            var todoItem = await _todoItemServices.GetTodoItemAsync(id);
            if (todoItem == null)
            {
                return NotFound();
            }
            await _todoItemServices.DeleteTodoItemAsync(id);
            return NoContent();
        }
        [HttpPut("{id}")]
        public async Task<ActionResult<IEnumerable<TodoItem>>> UpdateTodoItem(long id, TodoItem todoItem)
        {
            if (id != todoItem.Id)
            {
                return BadRequest();
            }
            var updateItem = await _todoItemServices.GetTodoItemAsync(id);
            if (updateItem == null)
            {
                return NotFound();
            }
            updateItem.Name = todoItem.Name;
            updateItem.IsComplete = todoItem.IsComplete;
            try
            {
                await _todoItemServices.UpdateTodoItemAsync(updateItem);
            }
            catch (DbUpdateConcurrencyException) when (!TodoItemExists(id))
            {
                return NotFound();
            }
            return NoContent();
        }

        private bool TodoItemExists(long id) =>
            _todoItemServices.GetTodoItem(id) != null;
    }
}